<?php

namespace Administrador\Model\Entity;
use Zend\Db\TableGateway\TableGateway;
use Zend\Db\Adapter\Adapter;

class Archivo extends TableGateway
{
  private $flName;
  private $flType;
  private $flTmp;
  private $flExt;
  private $flContenido;
  private $fltipo;
  private $msg = "";
  private $arrInt;
  private $arrOut;
  private $long =0;
  //conector base de datos
  private $odbc;
  private $catEstados;
  private $catPais;
  private $catDicc;
  private $estadoDesconocido;
  
  //contructor para  consegir la propiedades de file a subir
  //asi como el adaptador para la conexion
  public function __construct($nameFile,$tipo,$odbc)
  {
    if($nameFile != "null")
    {
      $this->flName = $_FILES[$nameFile]["name"];
      $this->flType = $_FILES[$nameFile]["type"];
      $this->flTmp = $_FILES[$nameFile]["tmp_name"];
      $this->flExt = strtolower(substr($this->flName, strrpos($this->flName, '.')+1));
      $this->flContenido = file($this->flTmp);
      $this->fltipo = $tipo;
      $this->long = count($this->flContenido); 
      
      if(empty($this->flContenido[1])):
        foreach($this->flContenido as $valor):
          $txt   =  $valor;
        endforeach;
        
        $this->flContenido = explode("\r",$txt);
        $aux = explode(',',$this->flContenido[0]);
        $this->long = count($aux);      
      endif;
 
    }
    $this->arrInt = array("\"\"","\"{","}\"",'"');
    $this->arrOut = array("\"","{","}",'"');

    $this->odbc = $odbc;
    $this->catEstados = $this->catalogos("states");
    $this->catPais = $this->catalogos("country");
    $this->catDicc = $this->catalogos("cat_diccionario");
  }
  
  //consigo catalogos 
  private function catalogos($tbl)
  {
    $catalogo = new TableGateway($tbl,$this->odbc);
    $data = $catalogo->select();  
    return $data->toArray();
  }
  
  //formateo textos con la primera letra mayusucla
  private function letraCapital($texto)
  {
    $salida = "NULL";
    $texto = str_replace($this->arrInt,"",$texto);
    $texto = str_replace(",","",$texto);
    
    if(!empty($texto)):
       $salida = ucfirst($texto);    
    endif;
    return $salida;
  }
  
  //valido el pais
  private function validaRegion($estado,$ciudad,$pais)
  {
    $catEstados = $this->catEstados;
    $catPais = $this->catPais;
    $catDicc = $this->catDicc;
    
    //inicio compruebo que no este vacio el estado
    if(!empty($estado)):
      
      //recorro los estados
      foreach($catEstados as $estados):
        
        $abre = strtolower($estados["state_abbreviation"]);
        $nombre = strtolower($estados["state_nombre"]); 
        $idpais = $estados["idcountry"];
        
        //busco la concordancia
        if($abre == $estado || $nombre == $estado):
          
          //recorro los paises
          foreach($catPais as $paises):
          
            //identifico el pais   
            if($paises["id_country"] == $idpais):
              $pais = $paises["country_abbreviation"];;
            endif;
            //termino de buscar el pais
          
          endforeach;
          //fin recorrido paises 
          $estado =  $abre;
          break;
        
        else:
          foreach($catDicc as $dicc):
            if(strtolower($estado) == strtolower($dicc["word"])):
            $estado = $dicc["abbreviation"];
            $pais = $dicc["abbreviation2"];
          endif;
         endforeach;
        endif;
        //fin concordancia
        
      endforeach;
      //fin recorrido estados
    
    else:
      //busco en el siguiente catalog
      $estado = "NULL";
      $pais = "NULL";
    endif;
    //fin compruebo que no este vacio el estado
    
    return strtoupper($estado).",".$ciudad.",".$pais.",";
  }

  //permite normaiulizar los datos del archivo de comas */
  private function normalizar($cadena)
  {
    //quitamos los saltos de linea
    $arrS = array("\n\r","\n","\r");
    //$cadena = eregi_replace("[\n|\r|\n\r]",'',$cadena);
    $cadena = str_replace($arrS,"",$cadena);
    $cadena = strtolower($cadena);
    
    //corto la cadena    
    $arr = array();
    $arr = explode(",",$cadena);
    $aux = "";
    $aux2 = "";
    $cont = 0;
    
    //recorro el arreglo resultante
    foreach($arr as $key => $valor):
    
      //inicio la normalizacion de los datos       
      switch($cont):
        
        //validacion de mail 
        case 0:
          if(filter_var($valor, FILTER_VALIDATE_EMAIL)):
            $aux .= $cont.','.$valor.",";
          endif;
        break;
        
        //formateo nombre y apellido para colocar la primera letra en capital
        case 2:
        case 3:
          $aux .= $this->letraCapital($valor).",";
        break;
        
        //formateo la fecha de nacimiento
        case 4:
          $aux2 =  explode("-",$valor);
          $aux .= $valor.",";
        break;
  
        //formateo genero e idioma 
        case 5:
          $aux .= strtoupper($valor).",";
        break;

        case 6:
        case 7:
        case 13:
        break;
        
        case 9:
          $aux .=$valor.",";
        break;


        //formateo fecha de registro
        case 8:
          date_default_timezone_set('UTC');
          //$auxF = explode (" ",$valor);
          //$aux2 = explode("-",$auxF[0]); 
          //$aux .= $aux2[2]."-".$aux2[1]."-".$aux2[0]." ".$auxF[1].":00,".strtotime($aux2[2]."-".$aux2[1]."-".$aux2[0]." ".$auxF[1].":00").",";    
          $valor = str_replace($this->arrInt,"",$valor);      
          $aux .= $valor.",".strtotime($valor).",";
        break; 
        
        //estado ciudad pais
        case 10:
          $estado = $valor;
        break;
        
        case 11:
          $ciudad = $this->letraCapital($valor);
        break;
        
        case 12:
          if(empty($valor)) :
            $valor ="NULL";
          endif; 
          $aux .= $this->validaRegion($estado,$ciudad,$valor);
        break;

        //subscripcion newslleter
        case 14:
          $valor = str_replace($this->arrInt,$this->arrOut,$valor);
          $news = json_decode($valor);
          if(count($news) == 0)
          {$resultado = "NULL";}
          else
          {
            foreach($news as $key):
              if(count($key) >0 )
              {$resultado = $valor;}
              else
              {$resultado = "NULL";}
            endforeach;
          }       
          $aux .= $resultado.",";
        break;
       
        //validacion de las opciones disponibles
        case 15:
        case 16:
        case 17:
        
          switch($valor):
            case "true":
              $resultado = "1";
            break;
            case "null":
              $resultado = "0";
            break;
            default:
              $resultado = "NULL";
            break;
          endswitch;
          $aux .= $resultado.",";
        break;
       
        case 7:
        case 13:
        case 18:
        case 19:
          $arrS = array("\n\r","\n","\r");
          //$cadena = eregi_replace("[\n|\r|\n\r]",'',$valor);
          $cadena = str_replace($arrS,"",$valor);
          if(empty($cadena))
          {$aux .="NULL,";}
          else
          {$aux .= $valor.",";}
        break;        
        
        
        //valores que no son validados
        default:
          $aux .= $valor.",";
        break;
      endswitch;
      //fin normalizacion de datos
    
      $cont++;
    endforeach;
    //fin de recorrido del arreglo resultante    
    $aux = substr($aux,0,-1);
    $aux = utf8_encode($aux);
    return json_encode($aux);
  }

/*armo el cuerpo de la tabla */
  private function armaBody()
  {
    $auxjson = "";
    $cont = 0;

    foreach($this->flContenido as $key => $valor):
      
      if($cont == 0):
          $aux = strtoupper($valor);
          $aux = json_encode($aux);
      else:
        $aux = $this->normalizar($valor);
      endif;
      $auxjson .= "\"col_".$cont."\":".$aux.",";
      
      $cont++; 
    endforeach;

    return $auxjson;
  }
  /*funcion que permite identificar los correos rebotados*/
  private function mailInvalido()
  {
    $cont = 0;
    $cadena = "";
    $update = new TableGateway("email_user",$this->odbc);
    
    
    if($this->long <= 8):
      for($a = 1 ; $a < count($this->flContenido) ; $a++):
        //echo $this->flContenido[$a]; 
        $cadena = explode(",",$this->flContenido[$a]); 
        $mail = array("email"=>$cadena[0]);      
        $data = array("validEmail"=>"1");
        if($update->update($data,$mail)): 
          $cont++;
        endif;
      endfor;   
        $resultado = (count($this->flContenido));
        $msg = "Se han modificado ".$cont." de ".$resultado." los registros enviados ...";
    else:
      $msg = "El archivo no concuerda con la solicitud ...";  
    endif;
    
    return $msg;
  }
  /** valido el tipo de archivo */
  private function valida()
  {
    if(!empty($this->flName)):
      if($this->flType != "application/vnd.ms-excel" && $this->flExt != "csv"):
     
        $this->msg = "{msg:'Extenci\u00F3n no valida solo se permite la extencion .csv ....',error:\"1\"}";
     
      else:
        switch($this->fltipo):
          case "0":
          
            if($this->long > 8):
              $columnas = "\"columnas\":\"".count($this->flContenido)."\"";
              $body = $this->armaBody();
              $this->msg = "{".$columnas.",".$body."error:\"0\"}";
            else:
              $this->msg ="{msg:'El archivo no concuerda con la solicitud ...',error:'0'}";
            endif;          
          
           break;
          
          case "1":
            $res = "'".$this->mailInvalido()."'";

            $this->msg = "{msg:".$res.",error:'3'}";
          break;
 
        endswitch;  
      endif;
    else:
      $this->msg = "{msg:'Seleccione el documento que desea subir .... ',error:'2'}";      
    endif;
  }
  
  /**/
  public function filtro()
  {
    $this->valida();
    return array("data"=>$this->msg);
  }
}

?>